<?xml version="1.0" encoding="utf-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:s="http://www.ascc.net/xml/schematron">
  <define name="book-element">
    <choice>
      <element name="book">
        <s:rule context="book">
          <s:assert test="@id = concat('b', isbn)"> The id needs to be the isbn number prefixed by &quot;b&quot; </s:assert>
        </s:rule>
        <attribute name="id"/>
        <attribute name="available"/>
        <ref name="isbn-element"/>
        <ref name="title-element"/>
        <zeroOrMore>
          <ref name="author-element"/>
        </zeroOrMore>
        <zeroOrMore>
          <ref name="character-element"/>
        </zeroOrMore>
      </element>
      <element name="book">
        <attribute name="id">
          <value>ggjh0836217462</value>
        </attribute>
        <attribute name="available"/>
        <ref name="isbn-element"/>
        <ref name="title-element"/>
        <zeroOrMore>
          <ref name="author-element"/>
        </zeroOrMore>
        <zeroOrMore>
          <ref name="character-element"/>
        </zeroOrMore>
      </element>
    </choice>
  </define>
  <start>
    <element name="library">
      <oneOrMore>
        <ref name="book-element"/>
      </oneOrMore>
    </element>
  </start>
  <define name="author-element">
    <element name="author">
      <attribute name="id"/>
      <ref name="name-element"/>
      <ref name="born-element"/>
      <optional>
        <ref name="dead-element"/>
      </optional>
    </element>
  </define>
  <define name="born-element">
    <element name="born">
      <text/>
    </element>
  </define>
  <define name="character-element">
    <element name="character">
      <attribute name="id"/>
      <ref name="name-element"/>
      <ref name="born-element"/>
      <ref name="qualification-element"/>
    </element>
  </define>
  <define name="dead-element">
    <element name="dead">
      <text/>
    </element>
  </define>
  <define name="isbn-element">
    <element name="isbn">
      <text/>
    </element>
  </define>
  <define name="name-element">
    <element name="name">
      <text/>
    </element>
  </define>
  <define name="qualification-element">
    <element name="qualification">
      <text/>
    </element>
  </define>
  <define name="title-element">
    <element name="title">
      <attribute name="xml:lang"/>
      <text/>
    </element>
  </define>
</grammar>
